package com.kfm;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Date;

public class Test {

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        // 获取 Student 类的字节码对象  Class<Student> 三种方式获取 获取的是同一个 字节码对象
        // new Student() --> Student 类对象
        Class<Student> studentClass = Student.class;
        System.out.println(studentClass.getSimpleName());
        System.out.println(studentClass.getPackageName());
        // 所有的 public 修饰的构造器
//        Constructor<?>[] constructors = studentClass.getConstructors();
//        System.out.println(constructors.length);
//        for (Constructor<?> constructor : constructors) {
//            System.out.println(constructor.getParameterCount());
//        }
//        // 其中一个 public 修饰的构造器 返回 指定字节码对象的参数类型的构造器
//        Constructor<Student> constructor = studentClass.getConstructor(String.class, Date.class);
//        // 获取构造器参数个数
//        System.out.println(constructor.getParameterCount());
        // 获取一个 任意修饰符修饰的构造器 获取 Student 类中 String,Date 参数列表的构造器
        Constructor<Student> declaredConstructor = studentClass.getDeclaredConstructor(String.class, Date.class);
        System.out.println(declaredConstructor.getParameterCount());
        // 不再检查构造器的访问修饰符
        declaredConstructor.setAccessible(true);
        // newInstance() 创建对象  new Student()
        Student zs = declaredConstructor.newInstance("张三", new Date());
        System.out.println(zs);
        // public 修饰的无参构造
//        Constructor<Student> constructor = studentClass.getConstructor();
//        Student student = constructor.newInstance();
//        System.out.println(student);
//        // 获取所有的构造器
//        Constructor<?>[] declaredConstructors = studentClass.getDeclaredConstructors();
//        System.out.println(declaredConstructors.length);
//
//        Class<? extends Student> aClass = new Student().getClass();
//
//        Class<?> aClass1 = Class.forName("com.kfm.Student");
//
//        System.out.println(studentClass == aClass);
//
//        System.out.println(studentClass == aClass1);
    }
}
